from rest_framework import permissions
from .models import Review


class IsAdminOrOwner(permissions.BasePermission):
    """
    自定义权限类：
    - 管理员可以查看和操作所有审核记录
    - 普通用户只能查看与自己相关的审核记录
    - 审核操作仅限管理员执行
    """

    def has_object_permission(self, request, view, obj):
        # 检查对象是否是Review实例
        if not isinstance(obj, Review):
            return False
            
        # 管理员可以访问所有记录
        if request.user.is_staff:
            return True
            
        # 普通用户只能访问与自己相关的记录
        if obj.user == request.user:
            return True
            
        # 如果是车辆审核，检查车辆所有者
        if obj.vehicle and obj.vehicle.user == request.user:
            return True
            
        return False

    def has_permission(self, request, view):
        # 确保用户已认证
        if not request.user.is_authenticated:
            return False
            
        # 只有管理员可以访问审核API
        if not request.user.is_staff:
            return False
            
        # 对于列表视图，允许管理员访问
        if view.action in ['list', 'pending', 'history']:
            return True
            
        # 对于创建操作，允许管理员访问
        if view.action == 'create':
            return True
            
        # 对于详情视图，使用has_object_permission检查
        if view.action in ['retrieve', 'update', 'partial_update', 'destroy']:
            return True
            
        # 对于审核操作，仅限管理员
        if view.action == 'approve':
            return True
            
        # 其他操作默认拒绝
        return False


class IsReviewer(permissions.BasePermission):
    """
    自定义权限类：仅允许审核员执行审核操作
    """

    def has_permission(self, request, view):
        # 审核操作仅限管理员（审核员）
        if view.action == 'approve':
            return request.user.is_authenticated and request.user.is_staff
        return True


class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    自定义权限类：
    - 所有用户可以查看审核记录
    - 仅管理员可以修改审核记录
    """

    def has_object_permission(self, request, view, obj):
        # 读取权限对所有请求开放
        if request.method in permissions.SAFE_METHODS:
            return True

        # 写入权限仅限管理员
        return request.user.is_staff